7.2 panic
panic
就是Go
语言中的崩溃,崩溃也就是程序不可用,这在实际的业务中基本是最严重的BUG
。
在大部分语言中,产生崩溃的原因基本是差不多的,大多都是访问了空指针、数组越界、内存溢出等。
基本可以总结为,发生崩溃都是与系统进行了非法的内存或资源操作。
本节代码存放目录为 lesson20
如何发生panic
我们在开发中应该极力避免发生panic
,想要知道怎么避免,我们首先需要知道panic
是怎么发生。
数组越界是经常遇到的崩溃原因,也就是说数组本身只有3
个元素,但是却去访问了第4
个元素,这时候访问不到就会出现崩溃。
但是事实上,在Go
语言中,是不可能出现数组越界的,当我们在代码中尝试访问越界的元素时,代码将会报错。
这是由于数组是长度固定的,所以编译器是会为我们进行代码检查的。
那么我们就可以想到,切片是长度可变的,那是不是就是会出现呢?答案是肯定的,代码如下所示:
var testSlice = []int{1, 2, 3}
fmt.Println(testSlice[4])
如何定位排查
执行上一段的代码,结果输出如下:
panic: runtime error: index out of range [4] with length 3
goroutine 1 [running]:
main.main()
/Users/xc/xcWork/YouCanGo/Code/YouCanGoCode/lesson20/lesson20.go:7 +0x1d
exit status 2
我们可以直接看到崩溃信息,通过崩溃信息我们可以快速的知道是什么原因产生的崩溃,如下所示:
panic: runtime error: index out of range [4] with length 3
同时在Go
语言中我们也可以快速定位到具体发生panic
发生的代码行数,如下所示:
/Users/xc/xcWork/YouCanGo/Code/YouCanGoCode/lesson20/lesson20.go:7 +0x1d
从上面的输出,我们可以快速知道发生崩溃的地方,也就是代码的第7
行。
手动panic
在Go
语言中,如果我们想要让程序主动崩溃,我们可以直接使用panic
关键字,如下代码所示:
a := "123t"
num, err := strconv.ParseInt(a, 10, 64)
if err != nil {
panic(err)
}
fmt.Println(num)
在上面的代码中,在发生错误时,我们直接使用panic(err)
进行操作,这样就会导致程序直接崩溃。
这种方法在实际业务也有一些应用场景。
比如说当发生一些安全错误时,我们就将程序主动崩溃。
比如发生错误会导致继续运行而产生更严重的逻辑错误,我们可以进行主动崩溃。
小结
本节我们对panic
的发生、排查进行了讲解,总结如下:
panic
就是Go
语言里的崩溃切片访问越界、空指针等会导致崩溃
通过崩溃堆栈输出可以快速定位崩溃原因及崩溃代码
可以通过
panic(err)
将程序主动崩溃